package com.harmontronics.hanma.paas.paas.utils;

import java.util.HashMap;
import java.util.Map;
import java.util.StringJoiner;
import net.sourceforge.pinyin4j.PinyinHelper;

public class PinYinUtils {

    private static final String DUO_YIN_ZI =
            "谌=甚,卜=补,佴=耐,长孙=张孙,亓=姬,乐=越,万俟=莫奇,重=崇,任=人,单=山,朴=票,区=欧,仇=求,种=冲,解=谢,查=渣,盖=哥,缪=秒,黑=和,繁=破,尉=于,折=舌,秘=比";

    private static Map<String, String> DuoYinMap = null;

    private static String transFirstWord(String name) {
        if (DuoYinMap == null) {
            DuoYinMap = parseDuoYinZi();
        }
        for (Map.Entry<String, String> entry : DuoYinMap.entrySet()) {
            if (name.startsWith(entry.getKey())) {
                name = name.replaceFirst(entry.getKey(), entry.getValue());
            }
        }
        return name;
    }

    /**
     * 解析多音字
     *
     * @return
     */
    private static Map<String, String> parseDuoYinZi() {
        Map<String, String> resultMap = new HashMap<>();
        String[] valArr = DUO_YIN_ZI.split(",");
        for (String val : valArr) {
            String[] duoYinArr = val.split("=");
            if (duoYinArr.length == 2) {
                resultMap.put(duoYinArr[0], duoYinArr[1]);
            }
        }
        return resultMap;
    }

    /**
     * 获取汉字首字母的方法。如： 张三 --> ZS 说明：暂时解决不了多音字的问题，只能使用取多音字的第一个音的方案
     *
     * @param hanzi 汉子字符串
     * @param isUpper
     * @return 大写汉子首字母; 如果都转换失败,那么返回null
     */
    public static String getHanziInitials(String hanzi, Boolean isUpper) {
        hanzi = transFirstWord(hanzi);
        String result = null;
        if (null != hanzi && !"".equals(hanzi)) {
            char[] charArray = hanzi.toCharArray();
            StringBuffer sb = new StringBuffer();
            for (char ch : charArray) {
                // 逐个汉字进行转换， 每个汉字返回值为一个String数组（因为有多音字）
                String[] stringArray = PinyinHelper.toHanyuPinyinStringArray(ch);
                if (null != stringArray) {
                    sb.append(stringArray[0].charAt(0));
                }
            }
            if (sb.length() > 0) {
                result = sb.toString();
            }
        }
        if (result == null) {
            return null;
        }
        return isUpper ? result.toUpperCase() : result;
    }

    /**
     * 获取汉字拼音的方法。如： 张三 --> zhang,san 说明：暂时解决不了多音字的问题，只能使用取多音字的第一个音的方案
     *
     * @param hanzi 汉子字符串
     * @param isUpper
     * @return 汉字拼音; 如果都转换失败,那么返回null
     */
    public static String getHanziPinYin(String hanzi, Boolean isUpper) {
        hanzi = transFirstWord(hanzi);
        String result = null;
        if (null != hanzi && !"".equals(hanzi)) {
            char[] charArray = hanzi.toCharArray();
            StringJoiner sb = new StringJoiner(",");
            for (char ch : charArray) {
                // 逐个汉字进行转换， 每个汉字返回值为一个String数组（因为有多音字）
                String[] stringArray = PinyinHelper.toHanyuPinyinStringArray(ch);
                if (null != stringArray) {
                    // 把第几声这个数字给去掉
                    sb.add(stringArray[0].replaceAll("\\d", ""));
                }
            }
            if (sb.length() > 0) {
                result = sb.toString();
            }
        }
        if (result == null) {
            return null;
        }
        return isUpper ? result.toUpperCase() : result;
    }

    /**
     * 获取汉字拼音的方法。如： 张三 --> zhangsan 说明：暂时解决不了多音字的问题，只能使用取多音字的第一个音的方案
     *
     * @param hanzi 汉子字符串
     * @param isUpper
     * @return 汉字拼音; 如果都转换失败,那么返回null
     */
    public static String getHanziPinYin2(String hanzi, Boolean isUpper) {
        hanzi = transFirstWord(hanzi);
        String result = null;
        if (null != hanzi && !"".equals(hanzi)) {
            char[] charArray = hanzi.toCharArray();
            StringBuilder sb = new StringBuilder();
            for (char ch : charArray) {
                // 逐个汉字进行转换， 每个汉字返回值为一个String数组（因为有多音字）
                String[] stringArray = PinyinHelper.toHanyuPinyinStringArray(ch);
                if (null != stringArray) {
                    // 把第几声这个数字给去掉
                    sb.append(stringArray[0].replaceAll("\\d", ""));
                }
            }
            if (sb.length() > 0) {
                result = sb.toString();
            }
        }
        if (result == null) {
            return null;
        }
        return isUpper ? result.toUpperCase() : result;
    }

    public static void main(String[] args) {
        System.out.println(PinYinUtils.getHanziInitials("瀚川智能科技平台", Boolean.TRUE));
        System.out.println(PinYinUtils.getHanziPinYin("瀚川智能科技平台", Boolean.TRUE));
    }

}
